iT邦幫忙

2025 iThome 鐵人賽

DAY 15
0
Security

現在是pwn的天下!系列 第 15

【Day-15】Return to csu

  • 分享至 

  • xImage
  •  

前言

前面說了那麼多,今天就來聊一聊ROP的經典技巧ret2csu,在早期的編譯器,__libc_csu_init基本上都會存在,有了這個函式,我們會有更多可利用的gadgets可以使用,我們可以利用這個函式設定參數來拿到shell

__libc_csu_init

__libc_csu_init,是一個在早期的編譯器都會被自動編譯進去的function(現在沒有了),它的功能主要是init libc
https://ithelp.ithome.com.tw/upload/images/20250819/20172088ClbYMV7ccc.png
我們可以清楚看到 __libc_csu_init 內部有許多 pop rxx 指令 的組合:

  • 其中一個 gadget 可以一次性將 rbx, rbp, r12, r13, r14, r15 六個暫存器都控制住。
  • 而在另一個 gadget 中,則會將這些暫存器的值搬移到 rdi, rsi, rdx,並且最終呼叫 [r12 + rbx*8] 指向的函數位址。

這代表什麼呢?
這代表我們能夠透過精心設計的 ROP chain,藉由這段現成的初始化程式碼,來完成一次「任意函數呼叫」。

換句話說,__libc_csu_init 幫我們準備好了一個萬用的呼叫器 (universal caller)

  • 想呼叫哪個函數?把位址放到 r12
  • 想要傳什麼參數?依序放進 r13, r14, r15,就能對應到 rdi, rsi, rdx
  • 最後跳到對應的 gadget,就能如願完成呼叫。

上一篇
【Day-14】Stack Pivoting
下一篇
【Day-16】CRHC - fast food restaurant🍔(fmt->ret2libc)
系列文
現在是pwn的天下!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言